/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Andrey Loskutov <loskutov@gmx.de> - Bug 445538
*******************************************************************************/
package org.eclipse.ui.internal.dialogs.cpd;
import org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.dialogs.cpd.CustomizePerspectiveDialog.DisplayItem;
/**
* A check listener which, upon changing the check state of a contribution
* item, checks if that item is eligible to be checked (i.e. it is in an
* available action set), and if not, informs the user of the illegal
* operation. If the operation is legal, the event is forwarded to the check
* listener to actually perform a useful action.
*
* @since 3.5
*/
class UnavailableContributionItemCheckListener implements ICheckStateListener {
private final CustomizePerspectiveDialog dialog;
private CheckboxTreeViewer viewer;
private ICheckStateListener originalListener;
/**
* @param viewer
* the viewer being listened to
* @param originalListener
* the listener to invoke upon a legal action
* @param dialog
* parent
*/
public UnavailableContributionItemCheckListener(CustomizePerspectiveDialog dialog, CheckboxTreeViewer viewer,
ICheckStateListener originalListener) {
this.dialog = dialog;
this.viewer = viewer;
this.originalListener = originalListener;
}
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
DisplayItem item = (DisplayItem) event.getElement();
ViewerFilter[] filters = viewer.getFilters();
boolean isEffectivelyAvailable = CustomizePerspectiveDialog.isEffectivelyAvailable(item, filters.length > 0 ? filters[0] : null);
if (isEffectivelyAvailable) {
// legal action - invoke the listener which will do actual work
originalListener.checkStateChanged(event);
return;
}
boolean isAvailable = CustomizePerspectiveDialog.isAvailable(item);
viewer.update(event.getElement(), null);
if (isAvailable) {
// the case where this item is unavailable because of its
// children
if (!viewer.getExpandedState(item)) {
viewer.expandToLevel(item, AbstractTreeViewer.ALL_LEVELS);
}
MessageBox mb = new MessageBox(viewer.getControl().getShell(), SWT.OK | SWT.ICON_WARNING | SWT.SHEET);
mb.setText(WorkbenchMessages.HideItemsCannotMakeVisible_dialogTitle);
mb.setMessage(NLS.bind(WorkbenchMessages.HideItemsCannotMakeVisible_unavailableChildrenText,
item.getLabel()));
mb.open();
} else {
MessageBox mb;
if (item.getIContributionItem() instanceof HandledContributionItem) {
mb = new MessageBox(viewer.getControl().getShell(), SWT.OK | SWT.ICON_WARNING | SWT.SHEET);
mb.setText(WorkbenchMessages.HideItemsCannotMakeVisible_dialogTitle);
// the case of a command contribution which has its own
// enablement rules, e.g. "org.eclipse.ui.window.pinEditor"
// command
final String errorExplanation = NLS.bind(
WorkbenchMessages.HideItemsCannotMakeVisible_unavailableCommandItemText, item.getLabel());
mb.setMessage(errorExplanation);
} else {
// the case where this item is unavailable because it belongs to
// an unavailable action set
mb = new MessageBox(viewer.getControl().getShell(), SWT.YES | SWT.NO | SWT.ICON_WARNING | SWT.SHEET);
mb.setText(WorkbenchMessages.HideItemsCannotMakeVisible_dialogTitle);
final String errorExplanation = NLS.bind(
WorkbenchMessages.HideItemsCannotMakeVisible_unavailableCommandGroupText, item.getLabel(),
item.getActionSet());
final String message = NLS
.bind("{0}{1}{1}{2}", new Object[] { errorExplanation, CustomizePerspectiveDialog.NEW_LINE, WorkbenchMessages.HideItemsCannotMakeVisible_switchToCommandGroupTab }); //$NON-NLS-1$
mb.setMessage(message);
}
if (mb.open() == SWT.YES) {
dialog.showActionSet(item);
}
}
}
}